<!-- 
    一.事件对象

    1.获取事件对象 - 兼容
    var ev  = ev || window.event;

    2.常见的事件类型 - 记住核心的
    Day 11 - Day 12 19号文件演示onchange/oninput/onkeydown

    3.event属性和方法介绍
        3.1鼠标位置属性
        - clientX,clientY：鼠标相对于可视区的位置。
        - pageX,pageY：鼠标相对于文档的位置。
        - offsetX,offsetY：鼠标相对于操作元素(鼠标位置)到元素边缘(左上)的位置.
        3.2.键盘事件的属性
        - which:标准浏览器识别，获取鼠标或者键盘按键的unicode编码。
        - keyCode:获取键盘按键的unicode编码。
        3.3.阻止浏览器的默认行为
        - preventDefault(); 标准浏览器阻止默认事件,DOM事件使用此方法取消默认事件。
        - returnValue = false; 非标准浏览器（IE8）阻止默认事件
        - return false;  退出执行, 所有触发事件和动作都不会被执行. 可以用来替代 preventDefault(普通事件采用)
        3.4.事件流 - DOM2级事件规定的事件流包括三个阶段：事件捕获阶段、目标阶段和事件冒泡阶段。
        - 事件捕获的概念
        - 事件冒泡的概念
        - 取消事件冒泡 - 事件类型相同。
            - 标准取消冒泡： stopPropagation()
            - IE取消冒泡： cancelBubble=true
        3.5.事件监听器,事件绑定
            - 标准浏览器事件监听:target.addEventListener("事件类型", 函数, 是否捕获(布尔值))
            - IE浏览器事件监听:target.attachEvent("事件类型",函数) 
            - 标准浏览器取消监听:target.removeEventListener()
            - IE浏览器取消监听:target.detachEvent()
            - 注意的重点
                - 普通事件和事件绑定的区别
                - 事件绑定下面标准浏览器和非标准浏览器的区别(四个不一样)
                    - 参数个数不一样
                    - 执行顺序不一样
                    - 事件类型不一样
                    - this指向不一样
        3.6.事件委托机制(代理)
            - 概念：利用冒泡机制，将子元素事件委托给父元素执行
            - 优缺点：
                - 减少事件注册次数，节约内存，提升性能
                - 缺点：所有事件都用事件代理，可能会出现事件误判。即本不该被触发的事件被绑定上了事件
            - 获取目标元素
                - event.target || event.srcElement
            - 获取事件类型
                - event.type

    4.列举事件对象下面有很多的兼容问题。
        - 获取事件对象  ev || window.event;
        - 键盘键码 ev.which || ev.keyCode
        - 浏览器的默认行为
        - 取消事件冒泡
        - 事件绑定和移除事件绑定
        - 获取目标元素 event.target || event.srcElement
        
    二.正则表达式
        - 表单验证案例
        - 读懂正则表达式 - 熟悉控制字符
        - 正则表达式的方法
            - test
            - exec
        - 支持正则的字符串方法
            - replace
            - split
            - match
            - search
        - 重点关注几个常见的正则。
            - 手机号码
            - 密码
            - 电子邮箱
            - 身份证号
            - ...
        - 关注正则的算法 - 处理字符串的算法。

    三.this以及函数下面的属性和方法
        - 函数的属性 - length - 参数的个数
        - 函数的方法 - call,apply,bind修改this指向及区别。
        - this在各个函数里面的指向问题。
        - 修改this指向的三种方式
            - call,apply,bind
            - 利用变量存储正确的this
            - new操作符
    四.JSON对象
        - JSON对象的特点
            - json:是一种轻量级的数据交换格式，不是js独有的。
            - json组成：简单值+'对象'+'数组'
            - json里面字符串需要添加双引号。
            - json没有var关键字,没有分号(;)等js相关的语法。
        - JSON对象下面的两个静态方法
            - JSON.parse
            - JSON.stringify

    五.ES6核心语法
        1.let和const关键字
            - let声明的变量存在块作用域，只在当前代码块内有效。变量会“绑定”在这个区域，不再受外部的影响。
            - let声明的不存在变量提升(暂时性死区)
            - let不允许在相同作用域内，重复声明同一个变量。
            - ES6允许块级作用域的任意嵌套，外层无法读取内层作用域的变量，反之可以
            - const声明一个只读的常量。一旦声明，常量的值就不能改变。
            - const声明的常量，也与let一样不可重复声明。
            - const的作用域与let命令相同：只在声明所在的块级作用域内有效。  

        2.变量的解构赋值--快速的给变量赋值
            - ES6允许按照一定模式，从数组和对象中提取值，对变量进行赋值，这被称为解构.
            - 数组的解构赋值
            - 对象的解构赋值

        3.扩展运算符
            - 扩展运算符用三个点号表示，功能是把数组或类数组对象展开成一系列用逗号隔开的值

        4.字符串扩展
            - 模板字符串(template string)是增强版的字符串，用反引号(`)标识。它可以当作普通字符串使用，也可以用来定义多行字符串，或者在字符串中嵌入变量(${}).

        5.箭头函数
            - 箭头函数最吸引人的地方是简洁。同时函数体内this对象不会改变了 - 箭头函数的this来自于父级。
            - 箭头函数适合于无复杂逻辑纯函数场景下
            - 不要在最外层定义箭头函数，因为在函数内部操作this会很容易污染全局作用域window
            - 不可以当作构造函数
            - 不可以使用arguments对象
            - 箭头函数是匿名函数。

        6.Symbol类型
            - symbol--表示独一无二的值，它是js中的第七种数据类型，属于基本类型
        
        7.Set（array）和Map( object )结构
            - ES6提供了数据结构Set. 它类似于数组，但是成员的值都是唯一的，没有重复的值，数组做参数
            - JS 的对象只能用字符串当作键。ES6 提供了 Map 数据结构,它类似于对象，但是“键”的范围不限于字符串

        8.Generators生成器函数
            - Generator 函数是 ES6 提供的一种异步编程解决方案，语法行为与传统函数完全不同。
            - Generator 函数是一个状态机，封装了多个内部状态
            - Generator 函数是一个普通函数，两个特征。一是，function与函数名之间有一个星号；二是，函数体内部使用yield（产出）表达式，定义不同的内部状态.
            - 每次调用遍历器对象下面的next方法，就会返回一个有着value和done两个属性的对象。value属性表示当前的内部状态的值，是yield表达式后面那个表达式的值；done属性是一个布尔值，表示是否遍历结束。

        9.for...of与其他遍历语法的比较
            - for循环这种写法比较麻烦，因此数组提供内置的forEach方法。
            - forEach方法没有返回值，无法使用break。
            - for...in循环主要是为遍历对象而设计的，不适用于遍历数组，数组是有序。
            - for...of循环相比上面几种遍历的写法是最优秀的。

        10.数组和对象的扩展
            - 数组的扩展方法
                - Array.from()方法用于将对象转为真正的数组(类数组转数组)
            - 对象的扩展方法
                - 对象的简洁表示法
                    - 属性名和属性值同名，写一个。
                    - 对象里面的方法也进行了简写
                - Object.assign()用于对象的合并，将源对象的所有可枚举属性，复制到目标对象。
                - Object.keys()获取对象所有的key(属性)集合，返回一个数组。
                - Object.values()获取对象所有的value(属性值)集合，返回一个数组。

        11.class(类)面向对象编程
 -->